home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc™ Source Code / Storage / Translt.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-28  |  20.7 KB  |  774 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Translt.cpp
  3.  
  4.     Contains:    Implementation of ODTranslation class.
  5.  
  6.     Owned by:    Vincent Lo
  7.  
  8.     Copyright:    © 1994 - 1996 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <2>     5/24/96    jpa        1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
  13.  
  14.     To Do: 
  15.     In Progress:
  16.         
  17. */
  18.  
  19. #define ODTranslation_Class_Source
  20. #define VARIABLE_MACROS
  21. #include <Translt.xih>
  22.  
  23. #ifndef SOM_Module_OpenDoc_StdDefs_defined
  24. #include <StdDefs.xh>
  25. #endif
  26.  
  27. #ifndef SOM_ODTypeList_xh
  28. #include <TypeList.xh>
  29. #endif
  30.  
  31. #ifndef SOM_ODTypeListIterator_xh
  32. #include <TypLsItr.xh>
  33. #endif
  34.  
  35. #ifndef SOM_ODStorageSystem_xh
  36. #include <ODStor.xh>
  37. #endif
  38.  
  39. #ifndef SOM_ODStorageUnitView_xh
  40. #include <SUView.xh>
  41. #endif
  42.  
  43. #ifndef SOM_Module_OpenDoc_StdTypes_defined
  44. #include <StdTypes.xh>
  45. #endif
  46.  
  47. #ifndef _ODMEMORY_
  48. #include "ODMemory.h"
  49. #endif
  50.  
  51. #ifndef _ISOSTR_
  52. #include "ISOStr.h"
  53. #endif
  54.  
  55. #ifndef _EXCEPT_
  56. #include "Except.h"
  57. #endif
  58.  
  59. #ifndef _ODMEMORY_
  60. #include "ODMemory.h"
  61. #endif
  62.  
  63. #ifndef _STORDEF_
  64. #include "StorDef.h"
  65. #endif
  66.  
  67. #ifndef _BARRAY_
  68. #include <BArray.h>
  69. #endif
  70.  
  71. #ifndef __TRANSLATION__
  72. #include <Translation.h>
  73. #endif
  74.  
  75. #ifndef __GESTALTEQU__
  76. #include <GestaltEqu.h>    // For Gestalt
  77. #endif
  78.  
  79. #ifndef __TOOLUTILS__
  80. #include <ToolUtils.h>    // For BitTst
  81. #endif
  82.  
  83. #ifndef __EDITIONS__
  84. #include <Editions.h>    // For FormatType
  85. #endif
  86.  
  87. #ifndef __ERRORS__
  88. #include <Errors.h>
  89. #endif
  90.  
  91. #ifndef __MIXEDMODE__
  92. #include <MixedMode.h>
  93. #endif
  94.  
  95. #ifndef _TRANSDLG_
  96. #include <TransDlg.h>
  97. #endif
  98.  
  99. #ifndef _STORUTIL_
  100. #include <StorUtil.h>
  101. #endif
  102.  
  103. #ifndef _TEMPOBJ_
  104. #include <TempObj.h>
  105. #endif
  106.  
  107. #pragma segment ODTranslation
  108.  
  109. #include "TransltB.cpp"    // Platform-independent methods, if any
  110.  
  111. #if ODDebug
  112. // #define ODDebug_Translation 1
  113. #endif
  114.  
  115. //==============================================================================
  116. // Scalar Types
  117. //==============================================================================
  118.  
  119. typedef struct {
  120.     ODOSType    destType;
  121. } TranslationHints;
  122.  
  123. typedef struct {
  124.     FormatType    theType;
  125.     long        theLength;
  126. } FormatAvailable;
  127.  
  128. //==============================================================================
  129. // Local Classes
  130. //==============================================================================
  131.  
  132. class TranslationRefCon {
  133.  
  134. public:
  135.  
  136.     TranslationRefCon() {fTypeList = kODNULL;
  137.                             fDataPtr = kODNULL;
  138.                             fDataType = kODNULL;
  139.                             fDataSize = 0;}
  140.     ~TranslationRefCon() {}
  141.     
  142.     void InitTranslationRefCon(ODTypeList* typeList) {fTypeList = typeList;}
  143.     void InitTranslationRefCon(ODTypeList*     typeList,
  144.                                 ODPtr            dataPtr, 
  145.                                 ODPlatformType    dataType,
  146.                                 ODULong        dataSize) {fTypeList = typeList;
  147.                                                             fDataPtr = dataPtr;
  148.                                                             fDataType = dataType;
  149.                                                             fDataSize = dataSize;}
  150.  
  151.     ODTypeList*    fTypeList;
  152.     ODPtr            fDataPtr;
  153.     ODPlatformType    fDataType;
  154.     ODULong        fDataSize;
  155. };
  156.  
  157. //==============================================================================
  158. // Function Prototype
  159. //==============================================================================
  160.  
  161. static OSErr CommonTranslate(ODTranslation* translation,
  162.                         Environment*    ev,
  163.                         ODValueType        fromType,
  164.                         ODByteArray*    fromData,
  165.                         ODValueType        toType,
  166.                         ODHandle*        destHandle);
  167.  
  168. static pascal OSErr GetScrapDataProc(ScrapType requestedFormat,
  169.                             Handle dataH,
  170.                             void* srcDataGetterRefCon);
  171.  
  172. static ODType LocalGetISOTypeFromPlatformType(ODPlatformType platformType,
  173.             ODPlatformTypeSpace typeSpace);
  174.  
  175. static ODPlatformType LocalGetPlatformTypeFromISOType(ODType isoType);
  176.  
  177. //==============================================================================
  178. // Globals
  179. //==============================================================================
  180.  
  181. static RoutineDescriptor    gGetScrapDataProcRD = BUILD_ROUTINE_DESCRIPTOR(uppGetScrapDataProcInfo, GetScrapDataProc);
  182.  
  183.  
  184. //==============================================================================
  185. // Class ODTranslation
  186. //==============================================================================
  187.  
  188. //------------------------------------------------------------------------------
  189. // ODTranslation: Purge
  190. //------------------------------------------------------------------------------
  191.  
  192. SOM_Scope ODSize  SOMLINK ODTranslationPurge(ODTranslation *somSelf, Environment *ev,
  193.         ODSize size)
  194. {
  195.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  196.     ODTranslationMethodDebug("ODTranslation","ODTranslationPurge");
  197.  
  198.     return 0;
  199. }
  200.  
  201. //------------------------------------------------------------------------------
  202. // ODTranslation: somUninit
  203. //------------------------------------------------------------------------------
  204.  
  205. SOM_Scope void  SOMLINK ODTranslationsomUninit(ODTranslation *somSelf)
  206. {
  207.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  208.     ODTranslationMethodDebug("ODTranslation","ODTranslationsomUninit");
  209.  
  210.     ODDeleteObject(_fTranslationDialog);
  211.     parent_somUninit(somSelf);
  212. }
  213.  
  214. //------------------------------------------------------------------------------
  215. // ODTranslation: InitTranslation
  216. //------------------------------------------------------------------------------
  217.  
  218. SOM_Scope void  SOMLINK ODTranslationInitTranslation(ODTranslation *somSelf, Environment *ev,
  219.         ODSession* session)
  220. {
  221.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  222.     ODTranslationMethodDebug("ODTranslation","ODTranslationInitTranslation");
  223.  
  224.     SOM_TRY
  225.  
  226.     /* Moved from somInit. SOM itself sets fields to zero
  227.     _fMEOExists = kODFalse;
  228.     _fTranslationDialog = kODNULL;
  229.     */
  230.     somSelf->InitObject(ev);
  231.  
  232.     _fSession = session;
  233.  
  234.     ODSLong result;
  235.     
  236.     _fMEOExists = (Gestalt(gestaltTranslationAttr, &result) == noErr) 
  237.                     && (BitTst(&result, 31 - gestaltTranslationMgrExists))
  238.                     && (&TranslateScrap != (void*)kUnresolvedCFragSymbolAddress);
  239.     
  240.     _fTranslationDialog = new TranslationDialog();
  241.     if (_fTranslationDialog)
  242.         _fTranslationDialog->InitTranslationDialog(session);
  243.     
  244.     SOM_CATCH_ALL
  245.     SOM_ENDTRY
  246. }
  247.  
  248. //------------------------------------------------------------------------------
  249. // ODTranslation: CanTranslate
  250. //------------------------------------------------------------------------------
  251.  
  252. SOM_Scope ODTranslateResult  SOMLINK ODTranslationCanTranslate(ODTranslation *somSelf, Environment *ev,
  253.         ODValueType fromType)
  254. {
  255.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  256.     ODTranslationMethodDebug("ODTranslation","ODTranslationCanTranslate");
  257.     
  258.     ODTranslateResult    result;
  259.  
  260.     SOM_TRY
  261.  
  262.     ODTypeList* typeList = somSelf->GetTranslationOf(ev, fromType);
  263.     
  264.     if (typeList->Count(ev) > 0)
  265.         result = kODCanTranslate;
  266.     else
  267.         result = kODCannotTranslate;
  268.         
  269.     delete typeList;
  270.     
  271.     SOM_CATCH_ALL
  272.         result = kODCannotTranslate;
  273.     SOM_ENDTRY
  274.         
  275.     return result;
  276. }
  277.  
  278. //------------------------------------------------------------------------------
  279. // ODTranslation: ShowPartTranslateDialog
  280. //------------------------------------------------------------------------------
  281.  
  282. SOM_Scope ODBoolean  SOMLINK ODTranslationShowPartTranslateDialog(ODTranslation *somSelf, Environment *ev,
  283.     ODPartWrapper* partWrapper)
  284. {
  285.     ODTranslationData *somThis = ODTranslationGetData(somSelf);
  286.     ODTranslationMethodDebug("ODTranslation","ODTranslationShowPartTranslateDialog");
  287.  
  288.     SOM_TRY
  289.  
  290.     return _fTranslationDialog->ShowPartTranslateDialog(partWrapper);
  291.  
  292.     SOM_CATCH_ALL
  293.     SOM_ENDTRY
  294.     return kODFalse;
  295. }
  296.  
  297. //------------------------------------------------------------------------------
  298. // ODTranslation: ShowTranslateDialog
  299. //------------------------------------------------------------------------------
  300.  
  301. SOM_Scope ODBoolean  SOMLINK ODTranslationShowTranslateDialog(ODTranslation *somSelf, Environment *ev,
  302.                 ODTypeList*    translateToList,
  303.                 ODUShort    initialKind,
  304.                 ODUShort*    selectedKind,
  305.                 ODEditor    initialEditor,
  306.                 ODBoolean    canChangeEditor,
  307.                 ODEditor*    selectedEditor)
  308. {
  309.     ODTranslationData *somThis = ODTranslationGetData(somSelf);
  310.     ODTranslationMethodDebug("ODTranslation","ODTranslationShowTranslateDialog");
  311.  
  312.     ODBoolean result = kODFalse;    ODVolatile(result);
  313.     ODUShort kind = initialKind;    ODVolatile(kind);
  314.     ODEditor editor = kODNULL;        ODVolatile(editor);
  315.  
  316.     *selectedKind = initialKind;
  317.     *selectedEditor = kODNULL;
  318.  
  319.     SOM_TRY
  320.     
  321.         // Convert from initial kind and editor
  322.         if ( initialEditor != kODNULL )
  323.             editor = ODISOStrFromCStr((char *) initialEditor);
  324.     
  325.         result = _fTranslationDialog->ShowTranslateDialog(
  326.                                                     translateToList,
  327.                                                     &kind,
  328.                                                     &editor,
  329.                                                     canChangeEditor,
  330.                                                     kODTrue);
  331.     
  332.         // Convert to selected kind and editor
  333.         if ( result )
  334.         {
  335.             *selectedKind = kind;
  336.             *selectedEditor = editor;
  337.             editor = kODNULL;
  338.         }
  339.  
  340.     SOM_CATCH_ALL
  341.     
  342.     SOM_ENDTRY
  343.  
  344.     ODDisposePtr((ODPtr) editor);
  345.  
  346.     return result;
  347. }
  348.  
  349. //------------------------------------------------------------------------------
  350. // ODTranslation: GetTranslationOf
  351. //------------------------------------------------------------------------------
  352. // Return the set of kinds the argument may be translated into.  Internally, this
  353. // routine converts to and from platform types to use the translation services of
  354. // the host platform.
  355.  
  356. SOM_Scope ODTypeList*  SOMLINK ODTranslationGetTranslationOf(ODTranslation *somSelf, Environment *ev,
  357.         ODValueType fromType)
  358. {
  359.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  360.     ODTranslationMethodDebug("ODTranslation","ODTranslationGetTranslationOf");
  361.  
  362.     SOM_TRY
  363.     
  364.     ODHandle destinationTypes;
  365.     
  366.     if (_fMEOExists == kODFalse)
  367.         THROW(kODErrNoSysTranslationFacility);
  368.  
  369.     // Initialize the parameters for TranslateScrap
  370.     // Set up ODTypeList as refCon
  371.     
  372.     TempODTypeList fromTypeList = _fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
  373.     fromTypeList->AddLast(ev, fromType);
  374.     
  375.     TranslationRefCon refCon;
  376.     refCon.InitTranslationRefCon(fromTypeList);
  377.  
  378.     destinationTypes = ODNewHandle(0);
  379.     
  380.     // This TranslateScrap is only a query
  381.     
  382.  
  383.     OSErr err = noErr;
  384.  
  385. //#ifdef __MWERKS__
  386.     // The following call is ifdef out because we don't have a 68K
  387.     // CFM library for Translation Manager yet.
  388.     
  389.     TranslateScrap((GetScrapDataUPP) &gGetScrapDataProcRD,
  390.                     &refCon,
  391.                     kFormatListFormat,
  392.                     (Handle) destinationTypes,
  393.                     kTranslationScrapProgressDialogID);
  394.                     
  395. //#endif
  396.  
  397.     THROW_IF_ERROR(err);
  398.     
  399.     // Put destinationTypes into a ODTypeList
  400.     
  401.     ODULong        numDestTypes = ODGetHandleSize(destinationTypes) / sizeof(FormatAvailable);
  402. #ifdef ODDebug_Translation
  403.     somPrintf("GetTranslationOf: numDestTypes %d\n", numDestTypes);
  404. #endif
  405.     FormatAvailable*    osTypes = (FormatAvailable*) ODLockHandle(destinationTypes);
  406.     ODTypeList*    toTypeList = _fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
  407.     
  408.     OSType    fromOSType = LocalGetPlatformTypeFromISOType(fromType);
  409.     
  410.     for (ODULong i = 0; i < numDestTypes; i++) {
  411.         if (osTypes[i].theType != fromOSType) {
  412.             TempODType isoType = // DMc: make temp to ensure deletion
  413.                 somSelf->GetISOTypeFromPlatformType(ev, osTypes[i].theType, kODPlatformDataType);
  414.             toTypeList->AddLast(ev, isoType);
  415.         }
  416.     }
  417.     
  418.     ODUnlockHandle(destinationTypes);
  419.     ODDisposeHandle(destinationTypes);
  420.     
  421.     // Return the created ODTypeList
  422.     
  423.     return toTypeList;
  424.  
  425.     SOM_CATCH_ALL
  426.     SOM_ENDTRY
  427.     return kODNULL;
  428. }
  429.  
  430. //------------------------------------------------------------------------------
  431. // ODTranslation: TranslateView
  432. //------------------------------------------------------------------------------
  433.  
  434. SOM_Scope ODTranslateResult  SOMLINK ODTranslationTranslateView(ODTranslation *somSelf, Environment *ev,
  435.         ODStorageUnitView* fromView,
  436.         ODStorageUnitView* toView)
  437. {
  438.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  439.     ODTranslationMethodDebug("ODTranslation","ODTranslationTranslateView");
  440.     
  441.     ODTranslateResult result = kODCannotTranslate;
  442.  
  443.     SOM_TRY
  444.  
  445.     if (_fMEOExists == kODFalse)
  446.         THROW(kODErrNoSysTranslationFacility);
  447.  
  448.     ODHandle    toDataHandle = kODNULL;
  449.     
  450.     // Get the source data    
  451.     TempODValueType fromType = fromView->GetType(ev); // DMc: ensure it's deleted
  452.     
  453.     ODULong size = fromView->GetSize(ev);
  454.     ODByteArray    fromDataBA;
  455.     fromView->GetValue(ev, size, &fromDataBA);
  456.  
  457.     // Get the to type
  458.     TempODValueType    toType = toView->GetType(ev); // DMc: ensure it's deleted
  459.  
  460.     // Do the translation
  461.     if (CommonTranslate(somSelf, ev, fromType, &fromDataBA, toType, &toDataHandle) == noErr) {
  462.     
  463.         // Create the toData
  464.         ODPtr toData = ODLockHandle(toDataHandle);
  465.         
  466.         // Set the value in the toView
  467.         StorageUnitViewSetValue(toView, ev, ODGetHandleSize(toDataHandle), toData);
  468.         
  469.         // Get rid of toData Byte Array and Handle
  470.  
  471.         ODUnlockHandle(toDataHandle);
  472.         ODDisposeHandle(toDataHandle);
  473.  
  474.         // Set up result
  475.         result = kODCanTranslate;
  476.     }
  477.     
  478.     ODDisposePtr(fromDataBA._buffer);
  479.     
  480.     SOM_CATCH_ALL
  481.         result = kODCannotTranslate;
  482.     SOM_ENDTRY
  483.  
  484.     return result;
  485. }
  486.  
  487. //------------------------------------------------------------------------------
  488. // ODTranslation: Translate
  489. //------------------------------------------------------------------------------
  490.  
  491. SOM_Scope ODTranslateResult  SOMLINK ODTranslationTranslate(ODTranslation *somSelf, Environment *ev,
  492.         ODValueType        fromType,
  493.         ODByteArray*    fromDataBA,
  494.         ODValueType        toType,
  495.         ODByteArray*    toDataBA)
  496. {
  497.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  498.     ODTranslationMethodDebug("ODTranslation","ODTranslationTranslate");
  499.     
  500.     ODTranslateResult    result = kODCannotTranslate;
  501.     ODHandle            toDataHandle = kODNULL;
  502.     
  503.     SOM_TRY
  504.  
  505.     // Check for MEO
  506.     
  507.     if (_fMEOExists == kODFalse)
  508.         THROW(kODErrNoSysTranslationFacility);
  509.     
  510.     ASSERT(fromDataBA != kODNULL, kODErrIllegalNullInput);
  511.     ASSERT(toDataBA != kODNULL, kODErrIllegalNullInput);
  512.     
  513.     // Translate
  514.     
  515.     if (CommonTranslate(somSelf, ev, fromType, fromDataBA, toType, &toDataHandle) == noErr) {
  516.         ODULong toDataSize = ODGetHandleSize(toDataHandle);
  517. #ifdef ODDebug_Translation
  518.     somPrintf("toDataHandle %x toDataSize %d\n", toDataHandle, toDataSize);
  519. #endif
  520.         ODPtr    toData = ODLockHandle(toDataHandle);
  521.         
  522.         *toDataBA = CreateByteArrayStruct(toData, toDataSize);
  523.         
  524.         // Get rid of handle
  525.         ODUnlockHandle(toDataHandle);
  526.         ODDisposeHandle(toDataHandle);
  527.         
  528.         // Set up return code
  529.         result = kODCanTranslate;
  530.     }
  531.     
  532.     SOM_CATCH_ALL
  533.         result = kODCannotTranslate;
  534.     SOM_ENDTRY
  535.     
  536.     return result;
  537. }
  538.  
  539. //------------------------------------------------------------------------------
  540. // ODTranslation: GetISOTypeFromPlatformType
  541. //------------------------------------------------------------------------------
  542.  
  543. SOM_Scope ODValueType  SOMLINK ODTranslationGetISOTypeFromPlatformType(ODTranslation *somSelf, Environment *ev,
  544.         ODPlatformType platformType,
  545.         ODPlatformTypeSpace typeSpace)
  546. {
  547.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  548.     ODTranslationMethodDebug("ODTranslation","ODTranslationGetISOTypeFromPlatformType");
  549.  
  550.     ODValueType type = kODNULL; ODVolatile(type);
  551.     
  552.     SOM_TRY
  553.     
  554.         type = LocalGetISOTypeFromPlatformType(platformType, typeSpace);
  555.         
  556.     SOM_CATCH_ALL
  557.     SOM_ENDTRY
  558.     
  559.     return type;
  560. }
  561.  
  562. //------------------------------------------------------------------------------
  563. // ODTranslation: GetPlatformTypeFromISOType
  564. //------------------------------------------------------------------------------
  565.  
  566. SOM_Scope ODPlatformType  SOMLINK ODTranslationGetPlatformTypeFromISOType(ODTranslation *somSelf, Environment *ev,
  567.         ODValueType type)
  568. {
  569.     ODTranslationData *somThis = ODTranslationGetData(somSelf); 
  570.     ODTranslationMethodDebug("ODTranslation","ODTranslationGetPlatformTypeFromISOType");
  571.     
  572.     SOM_TRY
  573.         return LocalGetPlatformTypeFromISOType(type);
  574.     SOM_CATCH_ALL
  575.     SOM_ENDTRY
  576.     
  577.     return '    ';    // This is just used to pacify the compiler. This return result
  578.                     // should never be used by the caller.
  579. }
  580.  
  581. //=====================================================================================
  582. // CommonTranslate
  583. //=====================================================================================
  584.  
  585. OSErr CommonTranslate(ODTranslation* translation,
  586.                         Environment*    ev,
  587.                         ODValueType        fromType,
  588.                         ODByteArray*    fromDataBA,
  589.                         ODValueType        toType,
  590.                         ODHandle*        destHandle)
  591. {
  592.     // Set up params for Translation
  593.     
  594.     *destHandle = kODNULL;
  595.     TranslationRefCon    refCon;
  596.     
  597.     TempODTypeList    fromTypeList = 
  598.         ODTranslationGetData(translation)->fSession->GetStorageSystem(ev)->CreateTypeList(ev, kODNULL);
  599.     fromTypeList->AddLast(ev, fromType);
  600.     
  601.     refCon.InitTranslationRefCon(fromTypeList,
  602.                                     fromDataBA->_buffer,
  603.                                     translation->GetPlatformTypeFromISOType(ev, fromType),
  604.                                     (ODULong) fromDataBA->_length);
  605.     
  606.     OSType    destType = translation->GetPlatformTypeFromISOType(ev, toType);
  607.  
  608.     // Do the translation
  609.  
  610. //#ifdef __MWERKS__
  611.     *destHandle = ODNewHandle(0);
  612.     OSErr err = TranslateScrap((GetScrapDataUPP) &gGetScrapDataProcRD,
  613.                     &refCon,
  614.                     destType,
  615.                     (Handle) *destHandle,
  616.                     kTranslationScrapProgressDialogID);
  617.     if (err != noErr) {
  618.         ODDisposeHandle(*destHandle);
  619.         *destHandle = kODNULL;
  620.     }
  621.     
  622.     return err;
  623.  
  624. //#else
  625.  
  626. //    return noErr;
  627.  
  628. //#endif
  629.  
  630. }
  631.  
  632. //=====================================================================================
  633. // LocalGetISOTypeFromPlatformType
  634. //=====================================================================================
  635.  
  636. ODType LocalGetISOTypeFromPlatformType(ODPlatformType platformType,
  637.             ODPlatformTypeSpace typeSpace)
  638. {
  639.     ODType        isoType = kODNULL;
  640.     ODULong    prefixSize;
  641.  
  642.     switch (typeSpace)
  643.     {             
  644.         case kODPlatformDataType:
  645.         
  646.             prefixSize = ODISOStrLength(kODAppleScrapTypePrefix);
  647.             isoType = (ODValueType) ODNewPtr(prefixSize + sizeof(ODPlatformType) + 1,
  648.                                         ODGetDefaultHeap());
  649.             if (isoType != kODNULL) {
  650.                 ODISOStrCopy(isoType, kODAppleScrapTypePrefix);
  651.                 ODISOStrNConcat(isoType, (ODISOStr) &platformType, sizeof(ODPlatformType));
  652.                 isoType[prefixSize + sizeof(ODPlatformType)] = 0;
  653.             }
  654.             break;
  655.             
  656.         case kODPlatformFileType:
  657.             prefixSize = ODISOStrLength(kODAppleFileTypePrefix);
  658.             isoType = (ODValueType) ODNewPtr(prefixSize + sizeof(ODPlatformType) + 1,
  659.                                         ODGetDefaultHeap());
  660.             if (isoType != kODNULL) {
  661.                 ODISOStrCopy(isoType, kODAppleFileTypePrefix);
  662.                 ODISOStrNConcat(isoType, (ODISOStr) &platformType, sizeof(ODPlatformType));
  663.                 isoType[prefixSize + sizeof(ODPlatformType)] = 0;
  664.             }
  665.             break;
  666.                         
  667.         default:
  668.             break;
  669.     }
  670.     
  671.     return isoType;
  672. }
  673.  
  674. //=====================================================================================
  675. // LocalGetPlatformTypeFromISOType
  676. //=====================================================================================
  677.  
  678. ODPlatformType LocalGetPlatformTypeFromISOType(ODType type)
  679. {
  680.  
  681.     ODPlatformType    platformType = (ODPlatformType) 0L;
  682.     ODULong            prefixSize;
  683.     
  684.     prefixSize = ODISOStrLength(kODAppleScrapTypePrefix);
  685.     if (ODISOStrNCompare(kODAppleScrapTypePrefix, (ODISOStr) type, prefixSize)) 
  686.     {
  687.         prefixSize = ODISOStrLength(kODAppleFileTypePrefix);
  688.         if (ODISOStrNCompare(kODAppleFileTypePrefix, (ODISOStr) type, prefixSize)) 
  689.         {
  690.             prefixSize = 0;
  691.             platformType = kODNULL;
  692.         }
  693.     }
  694.     if (prefixSize > 0)
  695.     {
  696.         ODISOStrNCopy((ODISOStr) &platformType,
  697.                         (ODISOStr) ((ODSByte*) type + prefixSize), 
  698.                         sizeof(ODPlatformType));
  699.     }
  700.     return platformType;
  701. }
  702.  
  703. //=====================================================================================
  704. // GetScrapDataProc
  705. //=====================================================================================
  706. pascal OSErr GetScrapDataProc(ScrapType requestedFormat,
  707.                             Handle data,
  708.                             void* srcDataGetterRefCon)
  709. {
  710. #ifdef ODDebug_Translation
  711.     somPrintf("Entering GetScrapDataProc.\n");
  712. #endif
  713.  
  714.     Environment*     ev = somGetGlobalEnvironment();
  715.     
  716.     ODHandle    dataHandle = (ODHandle) data;
  717.     
  718.     // Get the refCon and return the data for the requested type
  719.     TranslationRefCon* refCon = (TranslationRefCon*) srcDataGetterRefCon;
  720.     
  721.     if (requestedFormat == kFormatListFormat) {
  722.         ODTypeList*    typeList = refCon->fTypeList;
  723.         ODULong        numOfTypes = typeList->Count(ev);
  724.  
  725. #ifdef ODDebug_Translation
  726.     somPrintf("numOfTypes: %d\n", numOfTypes);
  727. #endif
  728.  
  729.         ODSetHandleSize(dataHandle, numOfTypes * sizeof(FormatAvailable));
  730.         
  731.         FormatAvailable* dataPtr = (FormatAvailable*) ODLockHandle(dataHandle);
  732.         ODTypeListIterator* iter = typeList->CreateTypeListIterator(ev);
  733.         ODType isoType = iter->First(ev);
  734.         for (ODULong i = 0; i < numOfTypes; i++) {
  735.             OSType osType = LocalGetPlatformTypeFromISOType(isoType);
  736. #ifdef ODDebug_Translation
  737.     somPrintf("OSType %x ISOType %s\n", osType, isoType);
  738. #endif
  739.             ODBlockMove(&osType, &(dataPtr[i].theType), sizeof(OSType));
  740.             dataPtr[i].theLength = 0;
  741.             ODDisposePtr(isoType);
  742.             isoType = iter->Next(ev);
  743.         }
  744.         ODDeleteObject(iter);
  745.         ODUnlockHandle(dataHandle);
  746.         
  747. #ifdef ODDebug_Translation
  748.         ODULong    hSize = GetHandleSize((Handle) dataHandle);
  749.         ODULong    j;
  750.         ODPtr        hDataPtr = ODLockHandle(dataHandle);
  751.         somPrintf("DataHandle: ");
  752.         for (j = 0; j < hSize; j++)
  753.             somPrintf("%x ", ((char*) hDataPtr)[j]);
  754.         somPrintf("\n");
  755.         ODUnlockHandle(dataHandle);
  756. #endif
  757.     }
  758.     else {
  759. #ifdef ODDebug_Translation
  760.         somPrintf("%x %s %d\n", refCon->fDataType, refCon->fDataPtr, refCon->fDataSize);
  761. #endif
  762.         ODSetHandleSize(dataHandle, refCon->fDataSize);
  763.         ODPtr dataPtr = ODLockHandle(dataHandle);
  764.         ODBlockMove(refCon->fDataPtr, dataPtr, refCon->fDataSize);
  765.         ODUnlockHandle(dataHandle);
  766.     }
  767.     
  768. #ifdef ODDebug_Translation
  769.     somPrintf("Exiting GetScrapDataProc.\n");
  770. #endif
  771.     return noErr;
  772. }
  773.  
  774.